/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package PanelesDePlatos;

import PanelesDeTrabajo.PanelPrincipalPlato;
import com.google.gson.Gson;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import net.miginfocom.swing.MigLayout;

/**
 *
 * @author hp
 */
public class VerPlato extends JPanel implements ActionListener
{
    private JPanel panelDatos;
    private JPanel panelTabla;
    private JPanel panelDescripcion;
    private JPanel panelFoto;
    private JPanel panelTextos;
    private JLabel labelNombreBox, labelFotoVacia, labelPrecio, labelValoracion, labelIngrediente, labelPeso, labelAporteCalorico, labelDescripcion, labelRecomendacion, labelFoto;
    private JTextField textoNombre, textoPrecio, textoValoracion, textoIngrediente, textoPeso, textoAporteCalorico;
    private JTextArea areaDescripcion, areaRecomendacion, areaDescripionNueva, areaRecomendacionNueva;
    private JTable tabla;
    private JTable tablaPlatos;
    private DefaultTableModel modelo;
    private DefaultTableModel modeloPlatos;
    private JScrollPane scroll, scrollDescripcion, scrollRecomendacion, scrollTablaPlatos, scrollDescripcionNueva, scrollRecomendacionNueva;
    private ImageIcon icon;
    private ArrayList<Plato> platos;
    List<String> platosOrdenados = new ArrayList<String>();
    private JComboBox comboBox;
    private Gson gson = new Gson();
    
    public VerPlato(ArrayList<Plato> platos) 
    {
        this.platos = platos;
        this.setLayout(new BorderLayout());
        
        icon = new ImageIcon("src/Resource/sin_foto.PNG");
        ImageIcon icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
        
        this.panelDatos = new JPanel();
        this.panelDatos.setLayout(new MigLayout());
        
        this.panelTabla = new JPanel();
        this.panelTabla.setLayout(new MigLayout());
        
        this.panelDescripcion = new JPanel();
        this.panelDescripcion.setLayout(new MigLayout());
        
        this.panelFoto = new JPanel();
        this.panelFoto.setSize(new Dimension(10, 10));
        this.panelFoto.setLayout(new MigLayout());
        JLabel label = new JLabel(icon2);
        this.panelFoto.add(label);
        
        this.comboBox = new JComboBox();
        
        this.labelNombreBox = new JLabel("Nombre");
        this.labelPrecio = new JLabel("Precio $");
        this.labelValoracion = new JLabel("Valoración");
        this.labelIngrediente = new JLabel("Ingrediente");
        this.labelPeso = new JLabel("Peso Kg");
        this.labelAporteCalorico = new JLabel("Aporte Calórico");
        this.labelDescripcion = new JLabel("Descripción");
        this.labelRecomendacion = new JLabel("Recomendación");
        this.labelFoto = new JLabel("Imagen");
        
        this.textoNombre = new JTextField(20);
        this.textoPrecio = new JTextField(20);
        this.textoValoracion = new JTextField(20);
        this.textoIngrediente = new JTextField(20);
        this.textoPeso = new JTextField(20);
        this.textoAporteCalorico = new JTextField(20);
        
        this.textoNombre.setEditable(false);
        this.textoPrecio.setEditable(false);
        this.textoValoracion.setEditable(false);
        this.textoIngrediente.setEditable(false);
        this.textoPeso.setEditable(false);
        this.textoAporteCalorico.setEditable(false);
        
        this.areaDescripcion = new JTextArea(5, 25);
        this.areaRecomendacion = new JTextArea(5, 25);
        this.areaDescripcion.setEnabled(false);
        this.areaRecomendacion.setEnabled(false);
        
        this.modelo = new DefaultTableModel()
        {
            public boolean isCellEditable(int row, int column) //Las celdas no son editables
            {
                if (row<tabla.getRowCount())
                {
                    return false;
                }
                return true;
            }
        };
        this.tabla = new JTable(modelo);
        this.tabla.getTableHeader().setReorderingAllowed(false);
        
        this.modelo.addColumn("Nombre Ingredientes");
        this.scroll = new JScrollPane(tabla);
        this.scroll.setViewportView(tabla);
        this.scrollDescripcion = new JScrollPane(areaDescripcion);
        this.scrollRecomendacion = new JScrollPane(areaRecomendacion);
        
        this.panelDatos.add(labelNombreBox);
        this.panelDatos.add(comboBox);
//        this.panelDatos.add(textoNombre);
        this.panelDatos.add(labelValoracion);
        this.panelDatos.add(textoValoracion);
        this.panelDatos.add(labelPrecio);
        this.panelDatos.add(textoPrecio, "wrap");
        this.panelDatos.add(labelPeso);
        this.panelDatos.add(textoPeso);
        this.panelDatos.add(labelAporteCalorico);
        this.panelDatos.add(textoAporteCalorico, "wrap");
        
        this.panelTabla.add(scroll, "wrap");
        
        this.panelDescripcion.add(labelFoto, "wrap");
        this.panelDescripcion.add(panelFoto, "wrap");
        this.panelDescripcion.add(labelDescripcion, "wrap");
        this.panelDescripcion.add(scrollDescripcion, "wrap");
        this.panelDescripcion.add(labelRecomendacion, "wrap");
        this.panelDescripcion.add(scrollRecomendacion, "wrap");
        
        this.panelTextos = new JPanel(new MigLayout());
        this.modeloPlatos = new DefaultTableModel()
        {
            public boolean isCellEditable(int row, int column) //Las celdas no son editables
            {
                if (row<tablaPlatos.getRowCount())
                {
                    return false;
                }
                return true;
            }
        };
        this.tablaPlatos = new JTable(modeloPlatos);
        this.tablaPlatos.getTableHeader().setReorderingAllowed(false);
        this.modeloPlatos.addColumn("Nombre");
        this.modeloPlatos.addColumn("Precio $");
        this.modeloPlatos.addColumn("Peso Kg");
        this.modeloPlatos.addColumn("Aporte Calórico (Kcal)");
        this.modeloPlatos.addColumn("Ingredientes");
        this.tablaPlatos.getColumnModel().getColumn(0).setPreferredWidth(5);
        this.tablaPlatos.getColumnModel().getColumn(1).setPreferredWidth(5);
        this.tablaPlatos.getColumnModel().getColumn(2).setPreferredWidth(5);
        this.tablaPlatos.getColumnModel().getColumn(3).setPreferredWidth(5);
        this.tablaPlatos.getColumnModel().getColumn(4).setPreferredWidth(200);
        this.scrollTablaPlatos = new JScrollPane(tablaPlatos);
        this.scrollTablaPlatos.setViewportView(tablaPlatos);
        
        this.areaDescripionNueva = new JTextArea(5, 25);
        this.areaRecomendacionNueva = new JTextArea(5, 25);
        this.areaDescripionNueva.setEditable(false);
        this.areaRecomendacionNueva.setEditable(false);
        
        this.scrollDescripcionNueva = new JScrollPane(areaDescripionNueva);
        this.scrollRecomendacionNueva = new JScrollPane(areaRecomendacionNueva);
        
        this.panelTextos.add(scrollDescripcionNueva);
        this.panelTextos.add(scrollRecomendacionNueva);
        this.add(scrollTablaPlatos);
        this.add(panelTextos, BorderLayout.SOUTH);
        
        
//        this.add(panelDatos, BorderLayout.NORTH);
//        this.add(panelTabla, BorderLayout.WEST);
//        this.add(panelDescripcion, BorderLayout.EAST);
        leerPlatosTxt();
        platosOrdenados();
        llenarTablaPlatos();
        this.comboBox.addActionListener(this);
        
    }
    
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object click = e.getSource();
        
        if (click == comboBox)
        {
            if (comboBox.getItemCount() > 0)
            {
                String nombre = comboBox.getSelectedItem().toString();
                llenarCamposVisibles(nombre);
            }
        }
    }
    
    public void llenarTablaPlatos()
    {
        while (modeloPlatos.getRowCount() > 0)
        {
            modeloPlatos.removeRow(0);
        }
        for (int i=0; i<platosOrdenados.size(); i++)
        {
            String nombre = platosOrdenados.get(i);
            int indice = posicionPlatoOrdenado(nombre);
            String precio = platos.get(indice).getPrecio()+"";
            String peso = platos.get(indice).getPeso()+"";
            String aporteCalorico = platos.get(indice).getAporteCalorico()+"";
            String listado = listadoIngredientes(indice);
            Object[] filaPlato = {nombre, precio, peso, aporteCalorico, listado};
            modeloPlatos.addRow(filaPlato);
        }
    }
    
    public int posicionPlatoOrdenado(String nombre) //Dado el nombre de plato (array ordenado) buscamos sus atributos en platos desordenados
    {
        for (int i=0; i<platos.size(); i++)
        {
            if (nombre.equals(platos.get(i).getNombre()))
            {
                return i;
            }
        }
        return 0;
    }
    
    public String listadoIngredientes(int indicePlato) //Recorremos un plato en particular, sus inredientes
    {
        String listado = "";
        
        for (int i=0; i<platos.get(indicePlato).getIngredientes().size(); i++)
        {
            if (i == (platos.get(indicePlato).getIngredientes().size() - 1))
            {
                listado = listado + platos.get(indicePlato).getIngredientes().get(i);
            }
            else
            {
                listado = listado + platos.get(indicePlato).getIngredientes().get(i) + ", ";
            }
        }
        return listado;
    }
    
    public void platosOrdenados()
    {
        platosOrdenados.clear();
        
        for (int i=0; i<platos.size(); i++) //Recorremos todos los platos
        {
            for (int j=0; j<platos.get(i).getIngredientes().size(); j++) //Recorremos arraylist de ingredientes de plato i
            {
                String nombreActual = platos.get(i).getNombre().toLowerCase();
                
                if (!existeNombrePlato(nombreActual))
                {
                    platosOrdenados.add(nombreActual.toLowerCase());
                }
            }
        }
        Collections.sort(platosOrdenados);
    }
    
    public boolean existeNombrePlato(String nombrePlatoActual) //Recorremos y preguntamos si el nombre existe, para no repetir
    {
        for (int i=0; i<platosOrdenados.size(); i++)
        {
            if (platosOrdenados.get(i).equals(nombrePlatoActual))
            {
                return true; //Existe
            }
        }
        return false; //No existe
    }
    
    public void llenarTablaVisible(int indice)
    {
        while (modelo.getRowCount() > 0)
        {
            modelo.removeRow(0);
        }
        
        for (int i=0; i<platos.get(indice).getIngredientes().size(); i++)
        {
            Object[] objeto = new Object[1];
            objeto[0] = (Object)platos.get(indice).getIngredientes().get(i); //Ingrediente correspondiente al plato
            modelo.addRow(objeto);
        }
    }
    
    public void llenarCamposVisibles(String nombre)
    {
        for (int i=0; i<platos.size(); i++)
        {
            if (platos.get(i).getNombre().equals(nombre))
            {
                textoPrecio.setText(platos.get(i).getPrecio()+"");
                textoAporteCalorico.setText(platos.get(i).getAporteCalorico()+"");
                textoPeso.setText(platos.get(i).getPeso()+"");
                areaDescripcion.setText(platos.get(i).getDescripcion());
                areaRecomendacion.setText(platos.get(i).getRecomendacion());
                llenarTablaVisible(i);
                updateUI();
           }
        }
    }
    
    public void llenarComboBox()
    {
        comboBox.removeAllItems();
        
        for (int i=0; i<platos.size(); i++)
        {
            String nombre = platos.get(i).getNombre(); 
            
            if (!existeNombre(nombre)) //si no está el nombre...
            {
                comboBox.addItem(nombre);
            }
        }
    }
    
    public boolean existeNombre(String nombre)
    {
        for (int i=0; i<comboBox.getItemCount(); i++)
        {
            if (nombre.equals(comboBox.getItemAt(i).toString())) //Existe ya el nombre de plano en el comboBox?
            {
                return true;
            }
        }
        return false;
    }
    
    public void leerPlatosTxt()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        platos.clear();
        
        try
        {
            archivo = new File("C:\\BaseDeDatos\\platos.txt");
            fr = new FileReader (archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea=br.readLine())!=null)
            {
                Plato plato = (Plato)gson.fromJson(linea, Plato.class);
                platos.add(plato);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( null != fr )
                {   
                    fr.close();     
                }                  
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }
}
